package org.example;

import com.alibaba.fastjson.JSONObject;
import com.google.gson.reflect.TypeToken;
import io.kubernetes.client.custom.IntOrString;
import io.kubernetes.client.custom.V1Patch;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.apis.AppsV1Api;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.*;
import io.kubernetes.client.proto.V1;
import io.kubernetes.client.proto.V1Apps;
import io.kubernetes.client.util.Config;
import io.kubernetes.client.util.Watch;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class k8s {
    public static void main(String[] args) throws IOException, ApiException {
        // 从文件读取配置文件
        ApiClient apiClient = Config.fromConfig("F:\\Java_code\\docker\\config");
        // 设置默认 Api 客户端到配置
        Configuration.setDefaultApiClient(apiClient);
        // 创建 CoreV1Api 实例-->创建，删除，更新集群资源
        CoreV1Api coreV1Api = new CoreV1Api();
        //根据配置文件创建相应的对象存放到需要创建的对象中去

//        // 获取 对应命名空间的 Pod 列表-->kubectl get pod -n dev
//        V1PodList podList = coreV1Api.listNamespacedPod("dev", null, null, null, null, null,null,null,null,null,null);
//        //获取所有空间中的pod列表
//        //V1PodList podList = coreV1Api.listPodForAllNamespaces(null, null, null, null, null, null, null, null,null,null);
//        // 打印 Pod 列表信息
//        podList.getItems().forEach(pod -> log.info(pod.getMetadata().getUid()));//getmetadata才可以获取pod信息
//
//        //创建pod 对象-->这里是直接创建pod对象而没有使用pod控制器,这个尽量不要用
//        V1Pod pod = new V1Pod();
//        V1ObjectMeta metadata = new V1ObjectMeta();-->编辑配置文件
//        metadata.setName("my-pod");

//        pod.setMetadata(metadata);
//        V1PodSpec spec = new V1PodSpec();--容器详细定义
//        spec.setContainers(Arrays.asList(new V1Container().name("nginx").image("nginx")));
//        pod.setSpec(spec);
//        coreV1Api.createNamespacedPod("dev", pod, null, null, null,null);
//
//
//        //创建pod控制器对象-->用这个来创建pod
//        V1Deployment deployment = new V1Deployment();
//        V1ObjectMeta metadata1 = new V1ObjectMeta();
//        metadata1.setName("my-deployment");
//        deployment.setMetadata(metadata1);
//        V1DeploymentSpec spec1 = new V1DeploymentSpec();
//        spec1.setReplicas(2);//副本数量
//        spec1.setSelector(new V1LabelSelector().matchLabels(Map.of("app","my-app")));
//        spec1.setTemplate(new V1PodTemplateSpec().metadata(new V1ObjectMeta().labels(Map.of("app","my-app")))
//                .spec(new V1PodSpec().containers(Arrays.asList(new V1Container().name("nginx").image("nginx")))));
//        deployment.setSpec(spec1);
//        //利用deployment创建pod
//        AppsV1Api appsV1Api = new AppsV1Api();-->组件api
//        appsV1Api.createNamespacedDeployment("dev", deployment, null, null, null,null);
//        //删除pod控制器对象
//        appsV1Api.deleteNamespacedDeployment("my-deployment", "dev", null, null, null,null,null,null);
//
//
//        //获取pod控制器列表
//        V1DeploymentList list = appsV1Api.listNamespacedDeployment("dev", null, null, null, null,null
//                ,null,null,null,null,null);
//        System.out.println(list.getMetadata());
//
//
//        //删除指定pod对象
//        coreV1Api.deleteNamespacedPod("my-pod", "dev", null, null, null,null,null,null);
//        //获取指定名称的pod
//        V1Pod pod1=coreV1Api.readNamespacedPod("my-pod1", "dev", null);
//        System.out.println(pod1.getMetadata().getName());
//
//
//        //创建命名空间
//        V1Namespace namespace = new V1Namespace();
//        V1ObjectMeta metadata1 = new V1ObjectMeta();
//        metadata1.setName("dev1");//名字
//        namespace.setMetadata(metadata1);
//        coreV1Api.createNamespace(namespace, null, null, null, null);
//        //删除命名空间
//        coreV1Api.deleteNamespace("dev1", null, null, null, null,null,null);
//        //获取命名空间列表
//        V1NamespaceList namespaceList = coreV1Api.listNamespace(null, null, null, null, null, null, null, null,null,null);
//        namespaceList.getItems().forEach(namespace1 -> log.info(namespace1.getMetadata().getName()));
//
//        //添加label
//        V1Pod pod1 = new V1Pod();
//        V1ObjectMeta metadata2 = new V1ObjectMeta();
//        metadata2.setName("my-pod1");
//
//        // 创建一个匹配标签的标签选择器
//        V1LabelSelector labelSelector = new V1LabelSelector();
//        Map<String, String> matchLabels = new HashMap<>();
//        //初始状态标签
//        matchLabels.put("app","myapp");
//        //更新状态标签
//        //matchLabels.put("app","myapp1");
//        labelSelector.setMatchLabels(matchLabels);
//        //添加标签
//        metadata2.setLabels(matchLabels);
//        pod1.setMetadata(metadata2);
//        V1PodSpec podSpec = new V1PodSpec();
//        podSpec.setContainers(Arrays.asList(new V1Container().name("my-container").image("nginx:latest")));
//        pod1.setSpec(podSpec);
//        coreV1Api.createNamespacedPod("dev", pod1, null, null, null,null);
//
//        //查看标签
//        V1PodList podList = coreV1Api.listNamespacedPod("dev", null, null, null, null, null, null, null, null, null,null);
//        podList.getItems().forEach(pod -> log.info(pod.getMetadata().getLabels().toString()));
//        //可以通过解析label标签对数据库进行查询

//        //更新pod1的标签，所有这种都可以传对象进来进行动态创建或者更新
//        //Map<String, String> matchLabels = new HashMap<>();创建一个空直接把他们的标签挤掉
//        V1Pod pod = coreV1Api.readNamespacedPod("my-pod1", "dev", null);
//        V1ObjectMeta metadata = pod.getMetadata();
//        metadata.setLabels(matchLabels);
//        pod.setMetadata(metadata);
//        coreV1Api.replaceNamespacedPod("my-pod1", "dev", pod, null, null, null, null);-->更新

//        //创建service
//        V1Service service = new V1Service();
//        V1ObjectMeta metadata3 = new V1ObjectMeta();
//        metadata3.setName("my-service");
//        metadata3.setNamespace("dev");
//        service.setMetadata(metadata3);
//        V1ServiceSpec spec = new V1ServiceSpec();
//        spec.setType("NodePort");
//        V1ServicePort port = new V1ServicePort();//-->端口信息
//        port.setName("http");//端口名
//        port.setPort(80);//service端口
//        port.setProtocol("TCP");//端口使用协议
//        port.setTargetPort(new IntOrString(8080));//pod端口
//        spec.setPorts(Collections.singletonList(port));//主机端口
//        spec.setSelector(Collections.singletonMap("app", "my-app"));//标签选择器，用于确定当前service代理哪些pod
//        service.setSpec(spec);
//        coreV1Api.createNamespacedService("dev", service, null, null, null,null);//创建service
//        //删除指定的service-->不好使
//        //coreV1Api.deleteNamespacedService("my-service", "dev", null, null, null, null,null,null);
//        //查询所有service
//        V1ServiceList list = coreV1Api.listNamespacedService
//                ("dev", null, null, null, null, null, null, null,null,null,null);
//        for (V1Service item : list.getItems()) {
//            System.out.println(item.getMetadata().getName());
//        }

//        //创建pv对象
//        V1PersistentVolume persistentVolume=new  V1PersistentVolume();
//        coreV1Api.createPersistentVolume(new V1PersistentVolume(),null,null,null,null);
//        //删除指定的pv
//        coreV1Api.deletePersistentVolume("pv-name",null,null,null,null,null,null);



    }
}